// 版权所有2010 Go作者。保留所有权利。
// 此源代码的使用受BSD样式
// 许可证的约束，该许可证可以在许可证文件中找到。

package math

// 下面的原始C代码、长注释和常量
// 来自FreeBSD的/usr/src/lib/msun/src/s_asinh。c 
// 并随附此通知。go代码是原始C.
// 
// ==============================================================================================================================
// Sun Microsystems，Inc.版权所有。
// 
// 由Sun Microsystems，Inc.业务部门SunPro开发。
// 使用、复制、修改和分发本
// 软件的权限是免费授予的，前提是保留本通知
// 的权利。第二部分：第二部分：第二部分：第二部分：第二部分：第二部分：第二部分：第二部分：第二部分：第二部分：第二部分：第二部分：第二部分：第七部分：第七部分：第七部分：第七部分：第七部分：第七部分：第19部分：第七部分：第七部分：第七部分：第七部分：第二部分：第七部分：第七部分：第二部分：第二部分：第二部分：第七部分：第七部分：第七部分：第七部分：第七部分：第七部分：第七部分：第七部分：第七部分：第七部分：第七部分：第七部分：第七部分：第七部分：第七部分：第七部分：第七部分：第七部分：第三部分：第七部分：第七部分：第七部分：第三部分：第七部分：第七部分：第七部分：第七部分：第七部分：第七部分：第七部分：第一,，如果| x |大于2，则表示符号（x）*（对数（x）+ln2），否则表示符号（x）*对数（2 | x |+1/（|x |+sqrt（x*x+1）），else 
// /:=符号（x）*log1p（|x |+x**2/（1+sqrt（1+x**2）））
// 

// Asinh返回x的反双曲正弦。
// 
// 特殊情况是：
func Asinh(x float64) float64 {
	if haveArchAsinh {
		return archAsinh(x)
	}
	return asinh(x)
}

func asinh(x float64) float64 {
	const (
		Large    = 1 << 28                    // 2**28 
	)
	// 特殊情况
	if IsNaN(x) || IsInf(x, 0) {
		return x
	}
	sign := false
	if x < 0 {
		x = -x
		sign = true
	}
	var temp float64
	switch {
	case x > Large:
		temp = Log(x) + Ln2 // 
	case x > 2:
	case x < NearZero:
	default:
	}
	if sign {
		temp = -temp
	}
	return temp
}
